home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / alib / csup / clib / rt.asm < prev    next >
Assembly Source File  |  1994-02-14  |  3KB  |  155 lines

  1.     section romhunks
  2. *
  3. *    68000 SUPPORT LIBRARY
  4. *    COPYRIGHT 1984 GREEN HILLS SOFTWARE
  5. *    MAY 28, 1984
  6. *    32 REMAINDER,DIVIDE, AND MULTIPLY PACKAGE
  7. *
  8. *    THIS PACKAGE IS DIVIDED INTO TWO PARTS.
  9. *    ALL REMAINDERS AND DIVIDES ARE DONE WITH ENTRY
  10. *    POINTS TO A 32 BIT DIVIDE/REMAINDER ROUTINE.
  11. *    THIS PACKAGE USES a0,a1,d0,d1,d2.
  12. *
  13. *    UNSIGNED AND SIGNED 32 BIT MULTIPLIES ARE IDENTICAL,
  14. *    AND ARE PERFORMED BY THE SAME ROUTINE. THIS ROUTINE
  15. *    USES d0,d1,d2, AND a0.
  16. *
  17. *    32 BIT REMAINDER AND DIVIDE ROUTINE
  18. *    PARAMETERS IN d1 AND d2
  19. *    THIS PACKAGE HAS BEEN TESTED ON 5000 RANDOM NUMBER
  20. *    PAIRS AGAINST THE VAX. THE NUMBER GENERATION SCHEME
  21. *    GENERATED NUMBERS OF SIZE 1-32 BITS RANDOMLY, AND SHOULD
  22. *    THEREFORE HAVE EXERCISED MOST CODE PATHS.
  23. *
  24. *    COMMENTS AND SUGGESTIONS FOR IMPROVEMENTS ARE WELCOME.
  25. POSDIV:
  26.     cmpi.l    #$0FFFF,d2    *DIVISOR MORE THAN 16 BITS OF SIGNIF?
  27.     bgt.s    LONGDIV        *YES, GOTO ITERATION DIVIDE
  28.     move.w    d1,a1        *STANDARD 32/16 DIVIDE WITHOUT LOSS
  29.     clr.w    d1
  30.     swap    d1
  31.     divu    d2,d1
  32.     move.l    d1,d0
  33.     swap    d1
  34.     move.w    a1,d0
  35.     divu    d2,d0
  36.     move.w    d0,d1
  37.     clr.w    d0
  38.     swap    d0
  39.     rts
  40. LONGDIV:
  41.     move.l    d1,d0
  42.     clr.w    d0
  43.     swap    d0
  44.     swap    d1
  45.     clr.w    d1
  46.     move.l    d2,a1
  47.     moveq    #$0F,d2
  48. LABEL1:    add.l    d1,d1        *BEGIN DIVIDE BY ITERATION
  49.     addx.l    d0,d0
  50.     cmp.l    d0,a1
  51.     bgt.s    LDEX
  52.     sub.l    a1,d0
  53.     addq.w    #1,d1
  54. LDEX:    dbf    d2,LABEL1
  55.     rts
  56. *
  57. * lmul, ulmul
  58. * 32 BIT MULTIPLY ROUTINES
  59.     xdef    lmult
  60.     xdef    ulmult
  61. lmult:
  62. ulmult:
  63.     move.l    d2,-(sp)    *SAVE d2 REGISTER
  64.     move.l    d0,d2
  65.     mulu    d1,d2
  66.     move.l    d2,a0
  67.     move.l    d0,d2
  68.     swap    d2
  69.     mulu    d1,d2
  70.     swap    d1
  71.     mulu    d1,d0
  72.     add.l    d2,d0
  73.     swap    d0
  74.     clr.w    d0
  75.     add.l    d0,a0
  76.     move.l    a0,d0
  77.     move.l    (sp)+,d2
  78.     rts
  79. *
  80. *    ulmodt
  81. *    UNSIGNED 32 BIT REMAINDER 
  82.     xdef    ulmodt
  83. ulmodt:    move.l    d2,-(sp)        *SAVE d2
  84.     move.l    d1,d2    *SETUP PARAMETERS
  85.     move.l    d0,d1
  86.     bsr.s    POSDIV        *CALL UNSIGNED DIV/REM ROUTINE
  87.     move.l    (sp)+,d2        *RESTORE d2
  88.     rts
  89. *
  90. *    uldiv
  91. *    UNSIGNED 32 BIT DIVIDE
  92.     xdef    uldivt
  93. uldivt:
  94.     move.l    d2,-(sp)        *SAVE d2 AND d3
  95.     move.l    d1,d2
  96.     move.l    d0,d1    *LOAD UP PARAMETERS
  97.     bsr    POSDIV
  98.     move.l    d1,d0
  99.     move.l    (sp)+,d2
  100.     rts
  101. *
  102. *    lrem
  103. *    SIGNED 32 BIT REMAINDER
  104. *    IF DIVISOR IS NEGATIVE, RESULT IS NEGATIVE.
  105.     xdef    lmodt
  106. lmodt:
  107.     move.l    d2,-(sp)    *SAVE d2
  108.     move.l    d1,d2
  109.     bge.s    lrem1
  110.     neg.l    d2
  111. lrem1:
  112.     move.l    d0,d1
  113.     moveq    #0,d0        *NEGATION FLAG OFF
  114.     tst.l    d1
  115.     bge.s    lrem2
  116.     neg.l    d1
  117.     not.l    d0        *NEGATION FLAG ON
  118. lrem2:    move.l    d0,a0        *MOVE FLAG TO A SAFE PLACE
  119.     bsr    POSDIV
  120.     move.w    a0,d2
  121.     beq.s    lremDONE
  122.     neg.l    d0
  123. lremDONE:    move.l (sp)+,d2        *RESTORE d2 
  124.     rts
  125. *
  126. *    ldivt    
  127. *    SIGNED 32 BIT DIVIDE
  128. *    IF DIVIDEND XOR DIVISOR IS NEGATIVE,
  129. *    RESULT MUST BE NEGATIVE.
  130.     xdef    ldivt
  131. ldivt:
  132.     move.l    d2,-(sp)
  133.     move.l    d0,a0
  134.     moveq    #0,d0
  135.     move.l    d1,d2
  136.     bge.s    ldiv1
  137.     neg.l    d2        *NEGATE OPERAND
  138.     not.l    d0
  139. ldiv1:    move.l    a0,d1
  140.     bge.s    ldiv2
  141.     neg.l    d1        *NEGATE OPERAND
  142.     not.l    d0
  143. ldiv2:    move.l    d0,a0        *TUCK AWAY NEGATION FLAG
  144.     bsr    POSDIV
  145.     move.l    a0,d2
  146.     beq.s    ldivRET
  147.     neg.l    d1
  148. ldivRET:    move.l    d1,d0
  149.     move.l    (sp)+,d2
  150.     rts
  151.  
  152.     end
  153.  
  154.